print("位与运算", 12 & 8)   # 位与运算 8       "全一为一"
"""
    1 1 0 0
&   1 0 0 0
-----------------
    1 0 0 0 

对应十进制 为：8
"""

print("位或运算", 12 | 8)   # 位或运算 12       "有一说一"
"""
    1 1 0 0
|   1 0 0 0
-----------------
    1 1 0 0 

对应十进制 为：12
"""

print("位异或运算", 12 ^ 8)   # 位异或运算 4       "相同为0，不同为1"
"""
    1 1 0 0
^   1 0 0 0
-----------------
    0 1 0 0 

对应十进制 为：4
"""

print("位取反", ~123)  # 位取反 -124
"""
            0 1 1 1 1 0 1 1
位取反       1 0 0 0 0 1 0 0
取反         1 1 1 1 1 0 1 1
+1                        1
            1 1 1 1 1 1 0 0
--------------------------------------
            1 1 1 1 1 1 0 0   符号位：1  数值：1 1 1 1 1 0 0 

对应十进制 为：-124
"""

print("左位移", 2 << 2)   # 左位移 8
"""
     0 0 1 0
<<   1 0 0 0
对应二进制向左边移两位，左边溢出的位被丢弃，右边的空位用0补充

对应十进制 为：8
"""

print("左位移", 2 << 3)   # 左位移 16
"""
           0 0 1 0
<<   0 0 1 0 0 0 0
对应二进制向左边移3位，左边溢出的位被丢弃，右边的空位用0补充

对应十进制 为：16
"""

print("右位移", 2 >> 2)    # 右位移 0
"""
因为是正数。原码=反码=补码

原码      0 1 0
>>       0 0 0

对应二进制向右边移3位，右边边溢出的位被丢弃。
左边的最高位，如果是0（正数），填0。如果是1（负数），填1。
对应十进制 为：0
"""

print("右位移", -10 >> 2)    # 右位移 -3
"""
原码       1 1 0 1 0
取反       1 0 1 0 1          符号位不变，不参与取反
+ 1       1 0 1 1 0
>>        1 1 1 0 1          因为这里是补码，计算完成之后要还原为原码，有两种形式：取反 ，+1    或者     -1 ，取反   
取反       1 0 0 1 0          -1    1 1 1 0 0
+1        1 0 0 1 1          取反   1 0 0 1 1
 

对应二进制向右边移3位，右边边溢出的位被丢弃。
左边的最高位，如果是0（正数），填0。如果是1（负数），填1。
对应十进制 为：-3
"""




